package com.foreveross.taskservice.taskcache;

import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;

import com.foreveross.taskservice.common.CacheDataSpace;
import com.foreveross.taskservice.common.TaskStatusEnum;
import com.foreveross.taskservice.common.model.AbstractTaskModel;


public interface ITaskCacheStorage {
	/**
	 * 添加一批任务到缓存中
	 * 因为涉及到加锁，请尽量保证任务数据空间的唯一性,即尽量避免set里面的任务有不同的任务类型和不同的渠道
	 * 一致的数据类型和一致的渠道是最理想也是最快的加锁方式
	 * 如果任务id已经存在于内存中，则会导致重复添加被忽略
	 * @param models
	 * @return
	 * @throws Exception
	 */
	public int addTasks(LinkedHashSet<AbstractTaskModel> models)throws Exception;
	/**
	 * 根据一定的数据空间和渠道提取一定数量的任务
	 * @param space
	 * @param channelId
	 * @param maxSize
	 * @return
	 * @throws Exception
	 */
	public LinkedHashSet<AbstractTaskModel> getTasks(CacheDataSpace space,String channelId,int maxSize)throws Exception;
	
	/**
	 * 将完成的任务进行回收
	 * 因为涉及到加锁，请尽量保证任务数据空间的唯一性,即尽量避免set里面的任务有不同的任务类型和不同的渠道
	 * 一致的数据类型和一致的渠道是最理想也是最快的加锁方式
	 * 当任务不存在时将会被忽略跳过
	 * @param tasks
	 * @return
	 * @throws Exception
	 */
	public <T extends AbstractTaskModel> int rollbacks(LinkedHashSet<AbstractTaskModel> tasks)throws Exception;
	/**
	 * 对指定数据空间完成的任务进行重新加载执行
	 * 如果指定的任务状态非完成则不会重新加载
	 * @param d
	 * @param channelId
	 * @param maxExcuteCount 允许执行的最大次数
	 * @param status 任务状态
	 * @return
	 * @throws Exception
	 */
	public int reloadCompensation(CacheDataSpace d,String channelId,int maxExcuteCount,TaskStatusEnum status)throws Exception;
	/**
	 * 根据日期和任务类型对完成
	 * @param d
	 * @param taskType
	 * @param channelId
	 * @param maxExcuteCount
	 * @param status
	 * @return
	 * @throws Exception
	 */
	public int reloadCompensation(Date d,int taskType,String channelId,int maxExcuteCount,TaskStatusEnum status)throws Exception;
	
	/**
	 * 根据渠道，状态，数量获取任务KEY
	 * @param channelcode
	 * @param status
	 * @param maxSize
	 */
	public List<AbstractTaskModel> getTasks(String channelId,int maxSize,String status) throws Exception;
	public List<AbstractTaskModel> getTasks(String channelId,String status) throws Exception;
}
